home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 2 / ETO Development Tools 2.iso / Tools - Objects / MacApp / MacApp CD Release / MacApp 2.0.1 (Many Libraries) / Tools / PostRez.p < prev    next >
Encoding:
Text File  |  1990-10-25  |  5.9 KB  |  253 lines  |  [TEXT/MPS ]

  1. {[a-,body+,h-,o=100,r+,rec+,t=4,u+,#+,j=20/57/1$,n-]}
  2.  
  3. {------------------------------------------------------------------------------
  4.  
  5. FILE PostRez.p
  6.  Copyright Apple Computer, Inc. 1986 - 1990
  7.  All rights reserved.
  8.  
  9. NAME
  10.  PostRez -- post process menu resources
  11.  
  12. SYNOPSIS
  13.  Looks at resorce file for cmnu resorces and
  14.    converts them to MENU resources while
  15.    extracting command numbers to create the
  16.    kMNTBbyCmdNumber resource
  17.  
  18. ------------------------------------------------------------------------------}
  19. PROGRAM PostRez;
  20.  
  21.     USES
  22.         { • MacApp }
  23.         UMacApp,
  24.         UAssociation,
  25.  
  26.         { • Building Blocks }
  27.         UMPWTool,
  28.  
  29.         { • Required for this unit's interface }
  30.  
  31.         { • Implementation use }
  32.         Memory, CursorCtl, Signal, PasLibIntf, IntEnv, Resources, ToolUtils, OSUtils;
  33.  
  34.     CONST
  35.         kInitialSize        = 100;
  36.  
  37.     TYPE
  38.         tableRec            = RECORD
  39.             cmd:                integer;
  40.             menu:                integer;
  41.             item:                integer;
  42.             END;
  43.         Table                = ARRAY [1..1] OF tableRec;
  44.         TablePtr            = ^Table;
  45.         TableHandle            = ^TablePtr;
  46.  
  47.         TPostRezTool        = OBJECT (TMPWTool)
  48.             fTableIndex:        integer;
  49.             fIncSize:            integer;
  50.             fTableHandle:        TableHandle;
  51.  
  52.             fResFileName:        str255;
  53.  
  54.             PROCEDURE TPostRezTool.IPostRezTool;
  55.             PROCEDURE TPostRezTool.AddToTable(commandNumber, menuNumber, itemNumber: integer);
  56.             PROCEDURE TPostRezTool.DoProcessFileArg(arg: str255); OVERRIDE;
  57.             PROCEDURE TPostRezTool.DoToolAction; OVERRIDE;
  58.             PROCEDURE TPostRezTool.DoAutoMagicCreatorAndBundle;
  59.  
  60.             END;
  61.  
  62.     VAR
  63.         gPostRezTool:        TPostRezTool;
  64.  
  65. {--------------------------------------------------------------------------------------------------}
  66.         {$S TInit}
  67.  
  68.     PROCEDURE TPostRezTool.IPostRezTool;
  69.  
  70.         BEGIN
  71.         ITool;
  72.  
  73.         fResFileName := '';
  74.         fTableIndex := 0;
  75.         fIncSize := 0;
  76.         fTableHandle := TableHandle(NewHandle(kInitialSize * sizeof(tableRec)));
  77.         FailNil(fTableHandle);
  78.         END;
  79.  
  80. {--------------------------------------------------------------------------------------------------}
  81.     {$S TInit}
  82.  
  83.     PROCEDURE TPostRezTool.DoProcessFileArg(arg: str255);
  84.  
  85.         BEGIN
  86.         IF fResFileName <> '' THEN
  87.             Stop('Sorry… only smart enough to process one file')
  88.         ELSE
  89.             fResFileName := arg;
  90.         END;
  91.  
  92. {--------------------------------------------------------------------------------------------------}
  93.     {$S TRes}
  94.  
  95.     PROCEDURE TPostRezTool.AddToTable(commandNumber, menuNumber, itemNumber: integer);
  96.  
  97.         BEGIN
  98.         IF fProgress THEN
  99.             BEGIN
  100.             Write('In add to table, cmd,menu,item= ', commandNumber: 5, menuNumber: 5, itemNumber:
  101.                   5);
  102.             WriteLn('  index = ', fTableIndex + 1: 1);
  103.             END;
  104.         fTableIndex := fTableIndex + 1;
  105.         fIncSize := fIncSize + 1;
  106.         IF fIncSize > kInitialSize THEN
  107.             BEGIN
  108.             fIncSize := 0;
  109.             SetHandleSize(Handle(fTableHandle), (fTableIndex + kInitialSize) * sizeof(tableRec));
  110.             FailMemError;
  111.             END;
  112.         WITH fTableHandle^^[fTableIndex] DO
  113.             BEGIN
  114.             cmd := commandNumber;
  115.             menu := menuNumber;
  116.             item := itemNumber;
  117.             END;
  118.         END;
  119.  
  120. {--------------------------------------------------------------------------------------------------}
  121.     {$S TRes}
  122.  
  123.     PROCEDURE CallAddToTable(commandNumber, menuNumber, itemNumber: integer);
  124.  
  125.         BEGIN
  126.         gPostRezTool.AddToTable(commandNumber, menuNumber, itemNumber);
  127.         END;
  128.  
  129. {--------------------------------------------------------------------------------------------------}
  130.     {$S TRes}
  131.  
  132.     PROCEDURE TPostRezTool.DoAutoMagicCreatorAndBundle;
  133.  
  134.         CONST
  135.             bundleType            = 'BNDL';
  136.             bundleID            = 128;
  137.  
  138.         TYPE
  139.             OSTypePtr             = ^OSType;
  140.             OSTypeHandle        = ^OSTypePtr;
  141.  
  142.         VAR
  143.             theFInfo:            FInfo;
  144.             theBundle:            OSTypeHandle;
  145.             aName:                str255;
  146.  
  147.         BEGIN
  148.         aName := fResFileName;
  149.         FailOSErr(GetFInfo(aName, 0, theFInfo));
  150.         theBundle := OSTypeHandle(Get1IndResource(bundleType, 1));
  151.         IF theBundle <> NIL THEN
  152.             BEGIN
  153.             theFInfo.fdCreator := theBundle^^;
  154.             theFInfo.fdFlags := BOR(theFInfo.fdFlags, fHasBundle);
  155.             END
  156.         ELSE
  157.             BEGIN
  158.             theFInfo.fdCreator := '????';
  159.             theFInfo.fdFlags := BAND(theFInfo.fdFlags, BNOT(fHasBundle));
  160.             END;
  161.         FailOSErr(SetFInfo(aName, 0, theFInfo));
  162.         END;
  163.  
  164. {--------------------------------------------------------------------------------------------------}
  165.     {$S TRes}
  166.  
  167.     PROCEDURE ConvertToMenu(cmnuHandle: Handle; menuID: integer; proc: ProcPtr);
  168.         EXTERNAL;
  169.  
  170.     PROCEDURE TPostRezTool.DoToolAction;
  171.  
  172.         VAR
  173.             i, j, num:            integer;
  174.             temp:                tableRec;
  175.             tempH:                Handle;
  176.             cmnuHandle:                Handle;
  177.             menuID:             integer;
  178.             menuType:            ResType;
  179.             name:                str255;
  180.             ref:                integer;
  181.             aName:                str255;
  182.  
  183.         BEGIN
  184.         IF fResFileName = '' THEN
  185.             Stop('No filename specified');
  186.  
  187.         aName := fResFileName;
  188.  
  189.         SetResLoad(FALSE);                                { avoid preloads }
  190.         ref := OpenResFile(aName);
  191.         SetResLoad(TRUE);
  192.         IF ref = - 1 THEN
  193.             FailResError;
  194.         num := CountResources('cmnu');
  195.         FailResError;
  196.         FOR i := num DOWNTO 1 DO                        {do backwords, since we are removing as we
  197.                                                          go}
  198.             BEGIN
  199.             cmnuHandle := GetIndResource('cmnu', i);
  200.             FailNil(cmnuHandle);
  201.             GetResInfo(cmnuHandle, menuID, menuType, name);
  202.             FailResError;
  203.             ConvertToMenu(cmnuHandle, menuID, @CallAddToTable);
  204.             END;
  205.  
  206.         IF fProgress THEN
  207.             BEGIN
  208.             WriteLn('All cmnu resources processed; about to sort');
  209.             END;
  210.  
  211.         {Sort the command table}
  212.         FOR i := 1 TO fTableIndex DO
  213.             FOR j := i TO fTableIndex DO
  214.                 IF fTableHandle^^[i].cmd > fTableHandle^^[j].cmd THEN
  215.                     BEGIN
  216.                     temp := fTableHandle^^[i];
  217.                     fTableHandle^^[i] := fTableHandle^^[j];
  218.                     fTableHandle^^[j] := temp;
  219.                     END;
  220.  
  221.         SetHandleSize(Handle(fTableHandle), fTableIndex * sizeof(tableRec));
  222.         FailMemError;
  223.  
  224.         tempH := GetResource(kMNTBbyCmdNumber, kIDMNTBbyCmdNumber);
  225.         IF tempH <> NIL THEN
  226.             RmveResource(tempH);
  227.         AddResource(Handle(fTableHandle), kMNTBbyCmdNumber, kIDMNTBbyCmdNumber, '');
  228.  
  229.         IF fProgress THEN
  230.             BEGIN
  231.             WriteLn('COMMAND TABLE:');
  232.             WriteLn('Cmd#  Menu# Item#');
  233.             FOR i := 1 TO fTableIndex DO
  234.                 WriteLn(fTableHandle^^[i].cmd: 4, fTableHandle^^[i].menu: 6, fTableHandle^^[i].item: 6);
  235.             END;
  236.  
  237.         DoAutoMagicCreatorAndBundle;
  238.  
  239.         CloseResFile(ref);
  240.         FailResError;
  241.         END;
  242.  
  243.     {$S TRes}
  244.  
  245.     BEGIN
  246.     InitUMPWTool;
  247.  
  248.     New(gPostRezTool);
  249.     FailNil(gPostRezTool);
  250.     gPostRezTool.IPostRezTool;
  251.     gPostRezTool.Run;
  252.     END.
  253.